/***
 *
 * @type {symbol}
 */

// {
//     let s = Symbol();
//     let s1 = Symbol('foo');
//     let s2 = Symbol('bar');
//     console.log(typeof s);
//     console.log(s1); // Symbol(foo)
//     console.log(s2); // Symbol(bar)
//     console.log(s1.toString()); // "Symbol(foo)"
//     console.log(s2.toString()); // "Symbol(bar)"
// }

// {
//     // 没有参数的情况
//     let s3 = Symbol();
//     let s4 = Symbol();
//     console.log(s3 === s4)
//     // 有参数的情况
//     let s1 = Symbol('foo');
//     let s2 = Symbol('foo');
//     console.log(s1 === s2)
// }

//Symbol 值不能与其他类型的值进行运算
// {
//     let sym = Symbol('My symbol');
//     String(sym) // 'Symbol(My symbol)'
//
//     Number(sym) // TypeError
//     console.log(sym + 2) // TypeError
//
//     let symA = Symbol();
//     Boolean(symA) // true
//     console.log(!symA)  // false
// }

// 属性名的遍历
// {
//   let mySymbol = Symbol();
//   {
//     // 第一种写法
//     let a = {};
//     a[mySymbol] = 'Hello!';
//     console.log(a[mySymbol]);
//   }
//   {
//     // 第二种写法
//     let mySymbol = Symbol();
//     let a = {
//       [mySymbol]: 'Hello!'
//     };
//     console.log(a[mySymbol]);
//     console.log(a);
//   }
//   {
//     // 第三种写法
//     let a = {};
//     Object.defineProperty(a, mySymbol, {value: 'Hello!'});
//     console.log(a[mySymbol]);
//
//   }
//
// //for in  and for of
// // {
// //     Object.prototype.objCustom = function () {
// //     };
// //     Array.prototype.arrCustom = function () {
// //     };
// //     let iterable = [3, 5, 7, "hello"];
// //     iterable.foo = "hello";
// //     console.log("--------for in--------")
// //     for (let i in iterable) {
// //         console.log(i); //  0, 1, 2,3, "foo", "arrCustom", "objCustom"
// //     }
// //     console.log("--------for of--------")
// //     for (let i of iterable) {
// //         console.log(i); // 3, 5, 7,"hello"
// //     }
// // }
//
// //遍历
//   {
//     let a = {
//       name: "yoa",
//       age: 18,
//       [mySymbol]: "Hello!",
//       [Symbol("sb2")]: "Symbol!"
//     };
//     console.log("------------Object.keys(a)-------------")
//     let keys = Object.keys(a);
//     console.log(keys);
//     console.log("------------Object.getOwnPropertySymbols(a)-------------")
//     let ownPropertySymbols = Object.getOwnPropertySymbols(a);
//     console.log(ownPropertySymbols);
//
//     //Reflect.ownKeys(a能获取所有属性名
//     console.log("------------Reflect.ownKeys(a)-------------")
//     let oAllNames = Reflect.ownKeys(a)
//     console.log(oAllNames)
//   }
// }

let s1 = Symbol.for("s");
let s2 = Symbol.for("s");
console.log(s1 === s2);
//Symbol的应用-----消除魔法字符串
// {
//   {
//       //获取面积
//       function getArea(shape, options) {
//           let area = 0;
//           switch (shape) {
//               case 'Triangle': // 魔术字符串
//                   area = .5 * options.width * options.height;
//                   break;
//           }
//           return area;
//       }
//       //获取周长
//       function getPerimeter(shape, options) {
//           let area = 0;
//           switch (shape) {
//               case 'Triangle': // 魔术字符串
//                   area = 0;
//                   break;
//           }
//           return area;
//       }
//       getArea('Triangle');
//       getPerimeter('Triangle');
//   }
//
//   {
//       let shapeType = {
//           triangle: Symbol(),//symbol
//           cha: Symbol(),//symbol
//           zfx: Symbol()//symbol
//       };
//       //获取面积
//       function getArea(shape, options) {
//           let area = 0;
//           switch (shape) {
//               case shapeType.triangle: // 魔术字符串
//                   area = .5 * options.width * options.height;
//                   break;
//           }
//           return area;
//       }
//       //获取周长
//       function getPerimeter(shape, options) {
//           let area = 0;
//           switch (shape) {
//               case shapeType.triangle: // 魔术字符串
//                   area = 0;
//                   break;
//           }
//           return area;
//       }
//       getArea(shapeType.triangle);
//       getPerimeter(shapeType.triangle);
//   }
// }
